#include "DiceThread.h"
#include <QTime>

DiceThread::DiceThread(QObject *parent) : QThread(parent)
{

}

void DiceThread::methodToThreadRun()
{
    //线程任务
    m_stop=false;//启动线程时令m_ stop=false
    m_seq=0; //掷骰子次数

    qsrand(QTime::currentTime().msec());//随机数初始化，qsrand 是线程安全的

    while(!m_stop) //循环主体
    {
        if (!m_Paused){

            m_diceValue=qrand(); //获取随机数
            m_diceValue= (m_diceValue % 6) +1;
            m_seq++ ;

            Q_EMIT newValue(m_seq,m_diceValue); //发射信号
        }
        QThread::msleep(500); //线程休眠500ms
    }

}

//! 采用方式二，不继承QThread需要注释
void DiceThread::run()
{
    //线程任务
    //异步调用
    //methodToThreadRun();

    //同步调用
    m_stop=false;
    m_seq=0;
    qsrand(QTime::currentTime().msec());//随机数初始化
    while(!m_stop){ //循环主体.

        if (!m_Paused)
        {
            mutex.lock();
//            QMutexLocker Locker (&mutex) ;
            m_diceValue = qrand(); //获取随机数
            m_diceValue =(m_diceValue%6) +1;
            m_seq++ ;
            mutex.unlock() ;
        }
        msleep(500); //线程休眠
    }

    quit();//相当于exit (0) ,退出线程的事件循环
}

void DiceThread::diceBegin()
{
    //开始掷骰子
    m_Paused = false;
}

void DiceThread::dicePause()
{
    //暂停掷骰子
    m_Paused = true;
}

void DiceThread::stopThread()
{
    //停止线程
    m_stop = true;
}

bool DiceThread::readValue(int *seq, int *diceValue)
{
    if (mutex.tryLock())
    {
        *seq = m_seq;
        *diceValue = m_diceValue;
        mutex.unlock();
        return true;
    }
    else
        return false;
}
